package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import vista.VentanaMenu;
import modelo.Equipo;
import modelo.Liga;
import modelo.Partido;


public class ControladorVentanaMenu implements ActionListener {
	
	private VentanaMenu ventanaMenu;
	Liga liga;
	private ControladorVentanaEquipo controlEquipo;
	private ControladorVentanaArbitro controlArbitro;
	private ArrayList<Equipo> equi;
	private ArrayList<Partido> partido;
	int w;
	
	
	public ControladorVentanaMenu(){
		
		liga = new Liga();
		equi = new ArrayList<Equipo>();
		partido = new ArrayList<Partido>();
		ventanaMenu = new VentanaMenu();
		ventanaMenu.setLocationRelativeTo(null);
		ventanaMenu.setVisible(true);	
		ventanaMenu.agregarListener(this);
		this.w = 1;
		//ventanaMenu.setEnableCalendario(false);

	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getActionCommand().equalsIgnoreCase("Cargar Equipos")){
			
			controlEquipo = new ControladorVentanaEquipo(liga);
			
		}else if(e.getActionCommand().equalsIgnoreCase("Cargar Arbitro")){
			
			controlArbitro = new ControladorVentanaArbitro(liga);
			
		}else 
		if(e.getActionCommand().equalsIgnoreCase("Generar Partidos")){
		//SI VECTOR DE ARBITRO es distinto de cero;es decir esta cargado el arbitro,genera partido;si no...
			if(liga.contarArbitro()!=0){
		       this.GenerarPartido();
		//VECTOR DE ARBITRO esta VACIO, y muestra mensaje.       
			}else{
				ventanaMenu.mostrarMensaje("SE DEBEN CARGAR LOS ARBITROS!!");
			}

			ventanaMenu.setEnableCalendario(true);
		}else if(e.getActionCommand().equalsIgnoreCase("Calendario de Juegos")){
			if(liga.contarPartido() > 0){
				
			
			}else
				System.out.println("ESTAS MEANDO FUERA EL PEROL..!!!");	
		}else 
			if(e.getActionCommand().equalsIgnoreCase("Tabla de Posiciones")){
			System.out.println("ESTAS MEANDO FUERA EL PEROL..!!!");
		}else
			return;

		//controladorEquipo =new ControladorVistaEquipo();
	}
	
	public void asignarResultados(int posC, int posV, Partido a){
		int indiceCasa, indiceVisit;
		int carrV = (int) Math.floor(Math.random() * 15);
		int cuadV = (int) Math.floor(Math.random() * 2);
		int carrC = (int) Math.floor(Math.random() * 15);
		int cuadC = (int) Math.floor(Math.random() * 2);
		boolean empate = false;

		System.out.println("Carreras Casa: " + carrC + " en el Partido: " + w);
		System.out.println("Cuadrangulares Casa: " + cuadC + " en el Partido: " + w);
		
		//hacer mientras 

		do{

			//*********************************Juego Normal**********************************
			if(empate == false){ // si no hay EMPATE

				if (carrC!=0){   //Si el Equipo de Casa tienes Carreras

					if (cuadC!=0){ //Si el Equipo de Casa tiene Cuadrangulares

						for(int p=1; p <= cuadC; p++){  //For que asigna aleatoriamente los jugadores,para CUADRANGULARES del EQUIPO CASA
							indiceCasa = (int) Math.floor(Math.random() * liga.getEquipo(posC).ContarJugadores());
							System.out.println("Indice Jugadores Cuadrangulares Casa: " + indiceCasa);
							System.out.println("Jugadores de Casa: " + liga.getEquipo(posC).ContarJugadores());
							a.agregarJugCuadCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
							System.out.println("El Jugador es: " + a.getEquipoCasa().ObtenerJugador(indiceCasa).getNombre() + " " + a.getEquipoCasa().ObtenerJugador(indiceCasa).getApellido());
						}
						carrC -= cuadC;  //Como en el partido si hubo cuadrangulares del equipo de casa, se le asigna Jugadores a las demas carreras si las hubo es decir se le restan los cuadrangulares

						if (carrC!=0){
							for(int h=0; h <= carrC; h++){
								indiceCasa = (int) Math.floor(Math.random() * a.getEquipoCasa().ContarJugadores());
								a.agregarJugCarrCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
							}
						}else{
							a.agregarJugCarrCasa(null);
						}

					}else{  //En caso de que no hubieron cuadrangulares, todas las carreras son asignadas a los jugadores
						for(int k=0; k < carrC; k++){
							indiceCasa = (int) Math.floor(Math.random() * a.getEquipoCasa().ContarJugadores());
							a.agregarJugCarrCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
						}
					}
				}else{
					a.setCarrEquipoCasa(carrC);
				}
				
				carrC += cuadC;

				//Asignacion de Carreras para el equipo visitante
				System.out.println("Carreras Visitante: " + carrV + " en el Partido: " + w);
				System.out.println("Cuadrangulares Visitante: " + cuadV + " en el Partido: " + w);

				if (carrV!=0){   //Si el Equipo de Casa tienes Carreras

					if (cuadV!=0){ //Si el Equipo de Casa tiene Cuadrangulares

						for(int p=1; p <= cuadV; p++){  //For que asigna aleatoriamente los jugadores
							indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
							System.out.println("Indice Jugadores Cuadrangulares Visitante: " + indiceVisit);
							System.out.println("Jugadores de Visitante: " + a.getEquipoVisitante().ContarJugadores());
							a.agregarJugCuadVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
							System.out.println("El Jugador es: " + a.getEquipoVisitante().ObtenerJugador(indiceVisit).getNombre() + " " + a.getEquipoVisitante().ObtenerJugador(indiceVisit).getApellido());
						}

						carrV -= cuadV;  //Como en el partido si hubo cuadrangulares del equipo de casa, se le asigna Jugadores a las demas carreras si las hubo

						if (carrV!=0){
							for(int h=0; h <= carrV; h++){
								indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
								a.agregarJugCarrVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
							}
						}else{
							a.agregarJugCarrVist(null);
						}

					}else{  //En caso de que no hubieron cuadrangulares, todas las carreras son asignadas a los jugadores
						for(int k=0; k < carrV; k++){
							indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
							a.agregarJugCarrVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
						}
					}
				}else{
					a.setCarrEquipoVisit(carrV);
				}
				
				carrV += cuadV;


			}else{
				
				//**************************************************************************************
				//*************************************Extra Inning*************************************
				//**************************************************************************************
				
				int carrExtC = (int) Math.floor(Math.random() * 15);
				int cuadExtC = (int) Math.floor(Math.random() * 2);
				int carrExtV = (int) Math.floor(Math.random() * 15);
				int cuadExtV = (int) Math.floor(Math.random() * 2);
				
				System.out.println("Carreras Casa EXTRAININGS: " + carrExtC + " en el Partido: " + w);
				System.out.println("Cuadrangulares Casa EXTRAININGS: " + cuadExtC + " en el Partido: " + w);

				if (carrExtC!=0){   //Si carreras del equipo CASA en EXTRAININGS es DISTINTO de CERO

					if (cuadExtC!=0){ //Si el Equipo de Casa tiene CUADRANGULARES en EXTRAININGS

						for(int p=1; p <= cuadExtC; p++){  //For que asigna aleatoriamente los jugadores
							indiceCasa = (int) Math.floor(Math.random() * a.getEquipoCasa().ContarJugadores());
							a.agregarJugCuadCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
							System.out.println("El Jugador que conecto cuadrangular en EXTRAININGS es: " + a.getEquipoCasa().ObtenerJugador(indiceCasa).getNombre() + " " + a.getEquipoCasa().ObtenerJugador(indiceCasa).getApellido());
						}
						carrExtC = carrExtC - cuadExtC;  //Como en el partido si hubo cuadrangulares del equipo de casa, se le asigna Jugadores a las demas carreras si las hubo

						if (carrExtC!=0){
							for(int h=0; h <= carrExtC; h++){
								indiceCasa = (int) Math.floor(Math.random() * a.getEquipoCasa().ContarJugadores());
								a.agregarJugCarrCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
							}
						}

					}else{  //En caso de que no hubieron CUADRANGULARES EN EXTRAINING, todas las carreras son asignadas a los jugadores
						for(int k=0; k < carrExtC; k++){
							indiceCasa = (int) Math.floor(Math.random() * a.getEquipoCasa().ContarJugadores());
							a.agregarJugCarrCasa(a.getEquipoCasa().ObtenerJugador(indiceCasa));
						}
					}
				}else{
					a.setCarrEquipoCasa(carrC);
				}
				
				carrExtC += cuadExtC;

				//Asignacion de Carreras para el equipo visitante en EXTRAININGS
				System.out.println("Carreras Visitante EXTRAININGS: " + carrExtV + " en el Partido: " + w);
				System.out.println("Cuadrangulares Visitante EXTRAININGS: " + cuadExtV + " en el Partido: " + w);

				if (carrExtV!=0){   //Si el Equipo de Casa tienes Carreras en EXTRAININGS

					if (cuadExtV!=0){ //Si el Equipo de Casa tiene Cuadrangulares en EXTRAININGS

						for(int p=1; p <= cuadExtV; p++){  //For que asigna aleatoriamente los jugadores
							indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
							a.agregarJugCuadVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
							System.out.println("El Jugador que conecto cuadrangular en EXTRAININGS es: " + a.getEquipoVisitante().ObtenerJugador(indiceVisit).getNombre() + " " + a.getEquipoVisitante().ObtenerJugador(indiceVisit).getApellido());
						}

						carrExtV -= cuadExtV;  //Como en el partido si hubo cuadrangulares del equipo de casa, se le asigna Jugadores a las demas carreras si las hubo

						if (carrExtV!=0){
							for(int h=0; h <= carrExtV; h++){
								indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
								a.agregarJugCarrVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
							}
						}

					}else{  //En caso de que no hubieron cuadrangulares, todas las carreras son asignadas a los jugadores
						for(int k=0; k < carrExtV; k++){
							indiceVisit = (int) Math.floor(Math.random() * a.getEquipoVisitante().ContarJugadores());
							a.agregarJugCarrVist(a.getEquipoVisitante().ObtenerJugador(indiceVisit));
						}
					}
				}else{
					a.setCarrEquipoVisit(carrV);
				}
				
				carrExtV += cuadExtV; // carreras en ININGS NORMALES "MAS" CUADRAGULARES en EXTRAININGS para obtener total de carreras reales
				
				carrC= carrC + carrExtC; // carreras de equipo CASA en ININGS NORMAlES "MAS" carreras en EXTRAININGS
				carrV= carrV + carrExtV; //// carreras de equipo VISITANTE  en ININGS NORMAlES "MAS" carreras en EXTRAININGS
			}


			if(carrC == carrV){
				empate = true;
				System.out.println("HUBO EMPATE!!!");
			}else{
				empate = false;
			}
         
			
		}while(empate == true);

		a.getEquipoCasa().setJuegosJugados(1);
		a.getEquipoVisitante().setJuegosJugados(1);

		//Determinar Ganador del Partido
		if (carrV > carrC){
			a.getEquipoVisitante().setJuegosGanados(1);
			a.getEquipoCasa().setJuegosPerdidos(1);
			System.out.println("Ganador del Partido " + w + " es el equipo Visitante: " + a.getEquipoVisitante().getNombreEquipo());
			System.out.println("El Numero de Juegos Ganados del Equipo Visitante es: " + a.getEquipoVisitante().getJuegosGanados());
		}else if(carrV < carrC){
			a.getEquipoCasa().setJuegosGanados(1);
			a.getEquipoVisitante().setJuegosPerdidos(1);
			System.out.println("Ganador del Partido " + w + " es el equipo Casa: " + a.getEquipoCasa().getNombreEquipo());
			System.out.println("El Numero de Juegos Ganados del Equipo Casa es: " + a.getEquipoCasa().getJuegosGanados());
		}

		w++;
	}

	
	// Metodo que ASIGNA los ARBITROS aleatoriamente
	public void asignarArbitro(Partido part){
		int indiceArbit = (int) Math.floor(Math.random() * liga.contarArbitro());
		part.setUmpirePrincipal(liga.getArbitro(indiceArbit).getNombre());
	}
	
	public void GenerarPartido(){
	
		//Se hace el primer for que va a asignar los equipos HomeClub
		for(int i=0; i < liga.contarEquipo(); i++ ){
			//int cuadVisit, cuadCasa, carrVisit, carrCasa, indiceVisit, indiceCasa;
			Partido part1 = new Partido(); //Son dos veces que el equipo va a estar como HomeClub
			Partido part2 = new Partido();
			
			part1.setEquipoCasa(liga.getEquipo(i));
			part2.setEquipoCasa(liga.getEquipo(i));
			
			System.out.println("Equipo Casa: " + part1.getEquipoCasa().getNombreEquipo());
			System.out.println("Equipo Casa: " + part2.getEquipoCasa().getNombreEquipo());
			
			for(int j=0; j < liga.contarEquipo(); j++){
				
				if(liga.getEquipo(j).getCodigoEquipo() != liga.getEquipo(i).getCodigoEquipo()){
					
					part1.setEquipoVisitante(liga.getEquipo(j));
					part2.setEquipoVisitante(liga.getEquipo(j));
					
					System.out.println("Equipo Visitante: " + part1.getEquipoVisitante().getNombreEquipo());
					System.out.println("Equipo Visitante: " + part2.getEquipoVisitante().getNombreEquipo());
					
					asignarResultados(i, j, part1);
					asignarResultados(i, j, part2);
					
					asignarArbitro(part1);
					asignarArbitro(part2);
					
					part1.setCodigoPartido("0001");
					part2.setCodigoPartido("0002");
					
					part1.setFechaPartido("03/12/11");
					part2.setFechaPartido("03/12/11");
					
					part1.setNumeroIningsJugados(9);
					part2.setNumeroIningsJugados(9);
					
					liga.agregarPartido(part1);
					liga.agregarPartido(part2);
					
					System.out.println("Numero de Partidos: " + liga.contarPartido());
				
				}
			}
			
		}
		
	}

}